<?php

namespace App\Api\Services;


use \Firebase\JWT\JWT;

class Token
{

    /**
     * 签发Token
     * @param string $key Token签名
     * @param array $data 加密的信息
     * @return string
     */
    public static function MakeToken($data, $key = 'key' )
    {
        //key
        $time = time(); //当前时间
        $payload = [
            'iss' => 'http://www.helloweba.net', //签发者 可选
            'aud' => 'http://www.helloweba.net', //接收该JWT的一方，可选
            'iat' => $time, //签发时间
            'nbf' => $time, //(Not Before)：某个时间点后才能访问，比如设置time+30，表示当前时间30秒后才能使用
            'exp' => $time+7200, //过期时间,这里设置2个小时
            'data' => $data //自定义信息，不要定义敏感信息

        ];
        $_token=JWT::encode($payload, $key); //输出Token
        return $_token;
    }

    /**
     * 解析Token
     * @param string $Token 令牌
     * @param string $key 签名
     * @return array
     */
    public static function ParseToken( $Token, $key='key')
    {
        //key要和签发的时候一样

        $jwt = $Token; //签发的Token
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式，这里要和签发的时候对应
            $arr = (array)$decoded;
            $res['code'] = 200;
            $res['data'] = $arr['data'];
            return $res;
        } catch(\Firebase\JWT\SignatureInvalidException $e) {  //签名不正确
            echo $e->getMessage();
        }catch(\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
            echo $e->getMessage();
        }catch(\Firebase\JWT\ExpiredException $e) {  // token过期
            echo $e->getMessage();
        }catch(\Exception $e) {  //其他错误
            echo $e->getMessage();
        }
        //Firebase定义了多个 throw new，我们可以捕获多个catch来定义问题，catch加入自己的业务，比如token过期可以用当前Token刷新一个新Token
    }



}
